package netmodule

import (
	"encoding/json"
	"fmt"
	"go_server/common"

	"github.com/astaxie/beego/logs"
)

// 处理函数的函数签名为-----传入的是包，返回的是字节流
type MsgHandleMap struct {
	FuncMap map[string]func(data any) any

	//还有需要可以扩展字段
}

var MsgHandleMapInstance *MsgHandleMap = nil

func init() {
	//直接初始化

	MsgHandleMapInstance = new(MsgHandleMap)
	MsgHandleMapInstance.FuncMap = make(map[string]func(data any) any)

}

// 第一个参数，客户端与服务端约定好的服务名称
func RegisterRpcFunc(callway string, handlerFun func(data any) any) {
	//这里自行去注册各种处理函数----业务callway：实际处理函数
	MsgHandleMapInstance.FuncMap[callway] = handlerFun

}

func FindFuncAndCall(ConSessionItem *common.SessionItem, FullPkg *common.PackageStruct) {

	var TarFunc func(data any) any

	var ok bool
	// 	收发数据结构：
	// id(2字节)+pkgLen(4字节)+body
	// body结构：
	// callWay(string)+ stringBody(string)----body为字符串，等待反序列化(最初也是json)
	//这里需要要对数据进行一个处理，得知需要callWay
	var bodyData RecvOuterData

	err := json.Unmarshal(FullPkg.Body, &bodyData)
	if err != nil {
		logs.Error("[logiclRegister.go:27]:json反序列化错误--请及时派排查")
		return
	}

	//根据callway去查找对应的处理函数
	if TarFunc, ok = MsgHandleMapInstance.FuncMap[bodyData.Callway]; !ok {
		logs.Error("[logiclRegister.go:35]:找不到对应的处理函数----请及时处理")
		return
	}

	//传进去的是一个结构体，返回的也是一个结构体，干脆直接传string,让函数里面去反序列化
	RawResponse := TarFunc(bodyData.Data)

	//直接反序列化
	ByteResponse, _ := json.Marshal(RawResponse)

	//后续记得注释掉-----
	if ConSessionItem == nil {
		fmt.Println("测试结束")
		return
	}
	//这里依旧需要再度封装一层
	// 发送包结构
	// type SendOuterData struct {
	// 	Callway string `json:"callway"`
	// 	ErrorId int    `json:"errorid"` //0表示没有错误，而其他值，自定义即可
	// 	Data    string `json:"data"`
	// }
	SendOuterData := SendOuterData{
		Callway: bodyData.Callway,
		Data:    ByteResponse,
		ErrorId: 0,
	}
	ByteSendData, _ := json.Marshal(SendOuterData)

	PostOutMsg(FullPkg.Head.PkgId, ByteSendData, uint32(len(ByteSendData)), ConSessionItem)

}
